package com.nxy.cpfsfe.busi.bbatproc;

import com.adtec.starring.datapool.EPOper;
import com.adtec.starring.exception.BaseException;
import com.adtec.starring.struct.dta.DtaInfo;
import com.nxy.cpfsfe.busi.bbatproc.chka.NCSChkASrv;
import com.nxy.cpfsfe.busi.btmgtsk.BTmgEndDChkATaskBean;
import com.nxy.cpfsfe.enumtype.MsgCdOrTpEnum;
import com.nxy.cpfsfe.enumtype.NCSFileTypEnum;
import com.nxy.cpfsfe.enumtype.RespCd;
import com.nxy.cpfsfe.service.CpfsService;
import com.nxy.cpfsfe.util.DateUtil;
import com.nxy.cpfsfe.util.XmlUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.Map;

public class NCSDlFNtcProcSrvBean implements CpfsService {
	
	private static final Logger LOGGER = LoggerFactory.getLogger(NCSDlFNtcProcSrvBean.class);
	
	/**
	 * 
	 * Description:NPS.919.001.01-NCS下载文件通知处理，主要对FileTp=ET01的报文进行处理
	 *
	 * @author jjw
	 * @data 2019年8月28日
	 */
	@Override
	public void doService() {
		
		try{
			String tpId = DtaInfo.getInstance().getTpId();
			String bizMsg = (String)EPOper.get(tpId, "ReqBean[0].body[0].BizMsg");
			if(bizMsg == null){
				throw new BaseException(RespCd.NCPO0110,"报文体缺少BizMsg属性");
			}
			LOGGER.info("接收到[{}]-[{}]：[{}]",MsgCdOrTpEnum.MSGCD_919.getCode(),MsgCdOrTpEnum.MSGCD_919.getName(),bizMsg);
			
			Map<String,String> bizMap = null;
			String fileTp = "";
			try{
				bizMap = XmlUtil.xml2Map(bizMsg);
				fileTp = bizMap.get("/transaction/body/SysParamNtfctn/FctvInf/FileTp");
			}catch(Exception e){
				throw new BaseException(RespCd.NCPO0101,e,"报文体BizMsg属性值解析失败");
			}
			
			//根据文件类型做相应处理
			Method method = NCSFileTypEnum.getProcMethodByCode(fileTp);
			method.setAccessible(true);
			method.invoke(this, bizMap);
			
            EPOper.put(tpId, "RspBean[0].head[0].rspsCd", RespCd.NCPI0000);
            EPOper.put(tpId, "RspBean[0].head[0].respsInfoDesc", "处理成功");
			LOGGER.info("[{}]-[{}]处理完成",MsgCdOrTpEnum.MSGCD_919.getCode(),MsgCdOrTpEnum.MSGCD_919.getName());
		}catch(BaseException e){
			throw e;
		}catch(InvocationTargetException e){
			Throwable tarEx = e.getTargetException();
			
			if(tarEx instanceof BaseException){
				//业务异常
				if(((BaseException) tarEx).getErrorCode().equals(RespCd.NCPO0001)){
					LOGGER.warn(((BaseException) tarEx).getErrorDesc());
				}else{
					throw (BaseException)tarEx;
				}
			}else{
				//未知异常
				String errMsg = String.format("[%s]-[%s]处理失败，出现未知异常", MsgCdOrTpEnum.MSGCD_919.getCode(),MsgCdOrTpEnum.MSGCD_919.getName());
				throw new BaseException(RespCd.NCPS7001,tarEx,errMsg);
			}
		}catch(Exception e){
			String errMsg = String.format("[%s]-[%s]处理失败，出现未知异常", MsgCdOrTpEnum.MSGCD_919.getCode(),MsgCdOrTpEnum.MSGCD_919.getName());
			throw new BaseException(RespCd.NCPS7001,e,errMsg);
		}
		
	}
	
	/**
	 * 
	 * Description:FileTp=ET01 处理方法
	 *
	 * @author jjw
	 * @data 2019年9月21日
	 */
	private void chkAFProcess(Map<String,String> bizMap){
		
		String orgId = bizMap.get("/transaction/body/SysParamNtfctn/GrpHdr/InstdPty/InstdDrctPty");
		String pCId = "NCS";
		Date chkAD = DateUtil.str2Date(bizMap.get("/transaction/body/SysParamNtfctn/FctvInf/FileNm").substring(0,8), "yyyyMMdd");
		String mfeTyp = bizMap.get("/transaction/header/msg/reserve");
		new NCSChkASrv(orgId,pCId,chkAD,mfeTyp).chkAProcess();

		//触发生成业务系统对账文件流程
		BTmgEndDChkATaskBean.timeTask(chkAD,"BBat");
		
	}
	
	/**
	 * 
	 * Description:不需要处理的FileTp
	 *
	 * @author jjw
	 * @data 2019年9月23日
	 */
	private void nonDeal(Map<String,String> bizMap){
		
		String fileTp = bizMap.get("/transaction/body/SysParamNtfctn/FctvInf/FileTp");
		LOGGER.info("不需要对[{}]-[{}]进行处理",fileTp,NCSFileTypEnum.getNameByCode(fileTp));
		
	}
	
}
